import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1.使用Python导入数据并进行过滤脏数据
df = pd.read_csv('手机销售分布分析.csv',encoding='gbk')
# 2.查看数据集的统计摘要信息，并形成总结
print(df.info())
print(df.describe())
print("由此可得  最大年龄为50  最小年龄为  16   总共有564169条数据")
# 3.统计出空值的记录数，将0进行替换并去重
print(df.isnull().sum())
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)
# 4.在界面上使用Matplotlib生成不同省份不同性别的消费平均金额的折线图，并设置标题，标签
df4 = df.groupby(['sex','province'])['price'].mean().reset_index()
print(df4)
for i in df4['sex'].unique():
    cc = df4[df4['sex'] == i]
    plt.plot(cc.province, cc.price,label=i)
plt.title('不同省份不同性别的消费平均金额的折线图')
plt.legend()
plt.xlabel('省份')
plt.ylabel('金额')
plt.show()
# 5.设计不同品牌的购买数量、总金额的图形，使用柱形图填充颜色为绿色，并设置标题，标签
df5 = df.groupby('brand').agg({'id':'count','price':'sum'}).reset_index()
print(df5)
fig,ax = plt.subplots(nrows=1, ncols=2)
ax[0].bar(df5['brand'], df5['id'],color='g')
ax[1].bar(df5['brand'], df5['price'],color='g')
plt.title('不同品牌的购买数量、总金额的图形')
plt.xlabel('品牌')
plt.ylabel('数量和金额')
plt.show()
# 6.在界面上使用Matplotlib生成不同星期的消费情况的直方图，并得出结论。
df['week'] = pd.to_datetime(df['start_time']).dt.weekday
plt.hist(df['week'])
plt.show()
# 7.在界面上使用Matplotlib生成不同性别的人数的饼图，形成相应业务结论。
df7 = df.groupby('sex').size().reset_index(name='count')
print(df7)
plt.pie(df7['count'],labels=df7.sex,autopct='%1.2f%%')
plt.show()
print("由此得出 男生人数相对较多")
# 8.在界面上使用Matplotlib生成每个年龄段男女分配的柱形图，柱形图边框线为3，
# 填充颜色为绿色，距离为2，形成相应业务结论
bins = [15,30,45,60]
df['年龄段'] = pd.cut(df['age'], bins=bins,labels=['15-30','30-45','45-60'])
df8 = df.groupby(['年龄段','sex']).size().reset_index(name='count')
print(df8)
width = 0.2
distince = 2
man_df = df8[df8['sex'] == '男']
plt.bar([i + distince for i in [0,1,2]],man_df['count'],linewidth=3,width=width,color='r')
fMan_df = df8[df8['sex'] == '女']
plt.bar([i + distince + width for i in [0,1,2]],fMan_df['count'],linewidth=3,width=width,color='g')
plt.xticks([i + distince + width *0.5 for i in [0,1,2]],labels=['15-30','30-45','45-60'])
plt.show()


print("15-45岁的人数最多，男女比例大概为1:1")
# 9.使用Matplotlib绘制不同城市在商品品类的渗透率(渗透率=该城市该人群购物总额/商品总付款额)，并形成分析结论
all_price = df['price'].sum()

df9 = df.groupby(['province','type'])['price'].sum().reset_index()
df9['渗透率'] = df9['price'] / all_price
print(df9)

print(df9['渗透率'].describe())
print("渗透率最大值为7.865288e-02，最小值为7.914954e-09，平均值为7.892660e-04")
# 10.在界面上使用图像可视化工具生成不同星期的消费情况的直方图，图像填充颜色为黄色，并解释x轴刻度，
# 得出相应的结论，并做出解答，解决中文乱码问题
plt.hist(df['week'], color = 'yellow')
plt.xlabel('星期')
plt.ylabel('人数')
plt.show()

print('周五和周六的购买量较大，其他时间相差不大')